﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using negocio.entidades;
using negocio.readOnly;
using negocio.servicios;

namespace web.form
{
    public partial class Compra : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                pnlPedido.Visible = true;
                pnlProductos.Visible = false;
                CargarCombo();
            }
        }

        protected void btnAceptarPedido_Click(object sender, EventArgs e)
        {
            if (cmbPedidos.SelectedIndex != 0)
            {
                pnlPedido.Visible = false;
                pnlProductos.Visible = true;

                EdicionVisible(false);

                ProductoService productoService = new ProductoService();
                IList<ProductoForCompraReadOnly> listaProductos =
                    productoService.ObtenerReadOnliesPorPedido(Convert.ToInt32(cmbPedidos.SelectedValue));
                Session["listaProductos"] = listaProductos;
                CargarGrillaProductos(listaProductos);
                CalcularTotales();
            }
        }


        protected void btnEditar_Click(object sender, EventArgs e)
        {
            if (grdProductos.SelectedDataKey != null)
            {
                EdicionVisible(true);
                Session["GridIndex"] = grdProductos.SelectedIndex;
                IList<ProductoForCompraReadOnly> listaProductos = (IList<ProductoForCompraReadOnly>) Session["listaProductos"];
                int cantidadPedida = listaProductos[grdProductos.SelectedIndex].Cantidad;
                txtEditarCantidadPedida.Text = cantidadPedida.ToString();
                valRanCantidad.MaximumValue = cantidadPedida.ToString();
            }
        }

        protected void btnAceptarCantidad_Click(object sender, EventArgs e)
        {
            IList<ProductoForCompraReadOnly> listaProductos = (IList<ProductoForCompraReadOnly>)Session["listaProductos"];
            listaProductos[Convert.ToInt32(Session["GridIndex"])].Cantidad = Convert.ToInt32(txtEditarCantidadPedida.Text);
            CargarGrillaProductos(listaProductos);
            CalcularTotales();
            EdicionVisible(false);
            Session["listaProductos"] = listaProductos;
        }

        protected void btnEliminar_Click(object sender, EventArgs e)
        {
            if (grdProductos.SelectedDataKey != null)
            {
                IList<ProductoForCompraReadOnly> listaProductos = (IList<ProductoForCompraReadOnly>)Session["listaProductos"];
                listaProductos.RemoveAt(grdProductos.SelectedIndex);
                Session["listaProductos"] = listaProductos;
                CargarGrillaProductos(listaProductos);
                CalcularTotales();
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            grdProductos.DataSource = null;
            pnlPedido.Visible = true;
            pnlProductos.Visible = false;
            CargarCombo();
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            CompraService service = new CompraService();
            IList<ProductoForCompraReadOnly> listaProductos = (IList<ProductoForCompraReadOnly>)Session["listaProductos"];
            int idPedido = Convert.ToInt32(cmbPedidos.SelectedValue);
            service.RegistrarCompra(listaProductos, idPedido);
            Show("Operación realizada con éxito");
            btnCancelar_Click(sender, e);
        }

        #region SOPORTE
        private void CargarCombo()
        {
            PedidoService pedidoService = new PedidoService();
            IList<IdNombreReadOnly> lista = pedidoService.ObtenerPedidosEnEstadoActivo();
            cmbPedidos.DataSource = lista;
            cmbPedidos.DataTextField = "Nombre";
            cmbPedidos.DataValueField = "Id";
            cmbPedidos.DataBind();
            cmbPedidos.Items.Insert(0, (lista.Count > 0) ? new ListItem("Seleccione...", "0") : new ListItem("No hay pedidos Activos", "0"));
        }

        private void CargarGrillaProductos(IList<ProductoForCompraReadOnly> lista)
        {
            grdProductos.DataSource = lista;
            string[] keys = new string[1];
            keys[0] = "Id";
            grdProductos.DataKeyNames = keys;
            grdProductos.DataBind();
            grdProductos.AutoGenerateSelectButton = true;
        }

        private void CalcularTotales()
        {
            IList<ProductoForCompraReadOnly> listaProductos = (IList<ProductoForCompraReadOnly>)Session["listaProductos"];
            int cantidadProductos = 0;
            double montoTotal = 0;
            foreach (var item in listaProductos)
            {
                cantidadProductos += item.Cantidad;
                montoTotal += item.PrecioCosto * item.Cantidad;
            }
            lblTotalMonto.Text = "$" + montoTotal.ToString();
            lblTotalProductos.Text = cantidadProductos.ToString();
        }

        private void EdicionVisible(bool visible)
        {
            if (visible)
            {
                lblEditarCantidad.Visible = true;
                txtEditarCantidadPedida.Visible = true;
                btnAceptarCantidad.Visible = true;
            }
            else
            {
                lblEditarCantidad.Visible = false;
                txtEditarCantidadPedida.Visible = false;
                btnAceptarCantidad.Visible = false;
            }
        }

        private static void Show(string message)
        {
            string cleanMessage = message.Replace("'", "\'");
            Page page = HttpContext.Current.CurrentHandler as Page;
            string script = string.Format("alert('{0}');", cleanMessage);
            if (page != null && !page.ClientScript.IsClientScriptBlockRegistered("alert"))
            {
                page.ClientScript.RegisterClientScriptBlock(page.GetType(), "alert", script, true);
            }
        }
        #endregion
    }
}